Spring 5 থেকে WebClient ইন্ট্রোডিউস করা হয়েছে, যা Spring WebFlux-এর অংশ। এটি একটি নন-ব্লকিং, রিয়াক্টিভ HTTP ক্লায়েন্ট এবং RestTemplate-এর আধুনিক বিকল্প হিসেবে ব্যবহৃত হয়। WebClient Spring 5 থেকে শুরু করে রিয়াক্টিভ এবং ব্লকিং উভয় ধরনের API কলের জন্য ব্যবহার করা যায়।
WebClient কেন ব্যবহার করবেন?
- নন-ব্লকিং এবং রিয়াক্টিভ প্রকৃতি:
- WebClient সম্পূর্ণরূপে নন-ব্লকিং I/O ব্যবহার করে, যা উচ্চ কর্মক্ষমতা প্রদান করে।
- এটি Reactive Streams-এর উপর ভিত্তি করে কাজ করে।
- RestTemplate-এর বিকল্প:
- RestTemplate একটি ব্লকিং ক্লায়েন্ট, যেখানে WebClient নন-ব্লকিং ও আরও দক্ষ।
- সার্ভিস-টু-সার্ভিস কমিউনিকেশন:
- মাইক্রোসার্ভিস আর্কিটেকচারে উচ্চ-দক্ষ HTTP ক্লায়েন্ট।
- আধুনিক API:
- JSON, XML, এবং অন্যান্য ডেটা ফরম্যাটের জন্য সহজ হ্যান্ডলিং।
WebClient যোগ করার জন্য Dependency
pom.xml এ নিচের নির্ভরতা যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
WebClient-এর বেসিক ব্যবহার
১. WebClient তৈরি:
WebClient তৈরি করার দুটি প্রধান পদ্ধতি আছে:
- ১.১ Default Instance: সরাসরি WebClient তৈরি করা।
WebClient webClient = WebClient.create();
- ১.২ Base URL সহ তৈরি করা:
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.build();
২. API কল করার পদ্ধতি:
২.১ GET Request:
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class ApiClient {
private final WebClient webClient;
public ApiClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://api.example.com").build();
}
public String getData(String endpoint) {
return this.webClient.get()
.uri(endpoint) // "/data"
.retrieve()
.bodyToMono(String.class) // Reactive Type
.block(); // Blocking call
}
}
২.২ POST Request:
public String postData(String endpoint, Object requestBody) {
return this.webClient.post()
.uri(endpoint)
.bodyValue(requestBody) // Request Body
.retrieve()
.bodyToMono(String.class)
.block();
}
৩. নন-ব্লকিং রিয়াক্টিভ কল (Reactive API):
নন-ব্লকিং পদ্ধতিতে block() না করে Reactive Streams ব্যবহার করা হয়।
public Mono<String> getReactiveData(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.bodyToMono(String.class); // Returns Mono<String>
}
WebClient কনফিগারেশন
Timeout কনফিগার করা:
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.clientConnector(new ReactorClientHttpConnector(
HttpClient.create().responseTimeout(Duration.ofSeconds(5))
))
.build();
Header যোগ করা:
public String getDataWithHeaders(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.header("Authorization", "Bearer some-token")
.header("Custom-Header", "value")
.retrieve()
.bodyToMono(String.class)
.block();
}
Error Handling:
public String getDataWithErrorHandling(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, clientResponse -> {
return Mono.error(new RuntimeException("4xx Error"));
})
.onStatus(HttpStatus::is5xxServerError, clientResponse -> {
return Mono.error(new RuntimeException("5xx Error"));
})
.bodyToMono(String.class)
.block();
}
Reactive API Response Types
- Mono: একটি অবজেক্ট রিটার্ন করে।
- Flux: একাধিক অবজেক্ট রিটার্ন করে।
উদাহরণ:
public Flux<String> getMultipleData(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.bodyToFlux(String.class); // Reactive Flux
}
WebClient-এর সাহায্যে ফাইল ডাউনলোড:
public Mono<Void> downloadFile(String fileUrl, String destination) {
return this.webClient.get()
.uri(fileUrl)
.retrieve()
.bodyToMono(byte[].class)
.doOnNext(bytes -> {
try {
Files.write(Paths.get(destination), bytes);
} catch (IOException e) {
e.printStackTrace();
}
})
.then();
}
WebClient-এর সুবিধা
- নন-ব্লকিং ও পারফরম্যান্স:
- নন-ব্লকিং I/O ব্যবহারে কর্মক্ষমতা বৃদ্ধি।
- Reactive Streams সাপোর্ট:
- Mono এবং Flux-এর মাধ্যমে স্ট্রিমিং ডেটা ম্যানেজমেন্ট।
- ব্যবহার সহজ:
- RestTemplate থেকে আরও ফিচার-সমৃদ্ধ এবং সহজ API।
- Header এবং Authorization সহজ হ্যান্ডলিং:
- OAuth2, JWT, এবং অন্যান্য নিরাপত্তা ফিচার সহজে ইন্টিগ্রেট করা যায়।
Spring WebFlux-এর WebClient একটি আধুনিক HTTP ক্লায়েন্ট যা RestTemplate-এর তুলনায় আরও দক্ষ এবং রিয়াক্টিভ মডেলের জন্য আদর্শ। এটি মাইক্রোসার্ভিস এবং ক্লাউড-নেটিভ অ্যাপ্লিকেশনের জন্য বিশেষভাবে উপযোগী।
Read more